package Traductor;

import java.io.Serializable;


public class CInstruccion implements Serializable {

	private TipoInstruccion instruccion;
	private Tipo tipo;
	private int dir;
	private double valor;
	private String lex;

	private static final long serialVersionUID = 1L;

	public CInstruccion(TipoInstruccion instruccion){
		this.instruccion = instruccion;
	}
	
	public CInstruccion(TipoInstruccion instruccion, int dir){
		this.instruccion = instruccion;
		this.dir = dir;
	}

	public CInstruccion(TipoInstruccion instruccion, Tipo tipo, double valor){//
		this.instruccion = instruccion;
		this.tipo = tipo;
		this.valor = valor;
	}
	
	public CInstruccion(TipoInstruccion instruccion, int dir, double valor){
		this.instruccion = instruccion;
		this.dir = dir;
		this.valor = valor;
	}
	
	public CInstruccion(TipoInstruccion instruccion, Tipo tipo, int dir, String lex){
		this.instruccion = instruccion;
		this.tipo = tipo;
		this.dir = dir;
		this.lex = lex;
	}

	public TipoInstruccion getInstruccion() {
		return instruccion;
	}

	public void setInstruccion(TipoInstruccion instruccion) {
		this.instruccion = instruccion;
	}

	public Tipo getTipo() {
		return tipo;
	}

	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}

	public int getDir() {
		return dir;
	}

	public void setDir(int dir) {
		this.dir = dir;
	}

	public double getValor() {
		return valor;
	}

	public void setValor(double valor) {
		this.valor = valor;
	}

	public String getLex() {
		return lex;
	}

	public void setLex(String lex) {
		this.lex = lex;
	}

	//Correspondencia TipoInstruccion <-> Operador
	public static TipoInstruccion getTipoInstruccion(Operador op){
		// Operador cuando sea asignacion el tipo de instruccion generada sera de la forma desapilaDir(..)
		return (op == Operador.asignacion) ? TipoInstruccion.desapilaDir : TipoInstruccion.valueOf(op.name());
	}
	
	public String toString(){
		String retVal = instruccion.name();
		switch (instruccion){
		case desapilaDir:
		case apilaDir:
			retVal+="("+dir+")";
			break;
		case apilaInt:
			retVal+="("+(int)valor+")";
			break;
		case apilaReal:
			retVal+="("+valor+")";
			break;
		case inMem:
			retVal+="("+tipo.name()+", "+dir+", "+lex+")";
			break;
		default:
			break;
		}
		return retVal;
	}
		
}
